package com.bus.common.jpa;

import java.io.Serializable;

import javax.persistence.LockModeType;

/**
 * hibernate DAO基类
 * 
 * 提供hql分页查询，拷贝更新等一些常用功能。
 * 
 * @param <T>
 *            entity class
 * @param <ID>
 *            entity id
 */
public abstract class JpaBaseDao<T, ID extends Serializable> extends
		JpaSimpleDao {
	/**
	 * @see Session.get(Class,Serializable)
	 * @param id
	 * @return 持久化对象
	 */
	protected T get(ID id) {
		return get(id, false);
	}

	/**
	 * @see Session.get(Class,Serializable,LockMode)
	 * @param id
	 *            对象ID
	 * @param lock
	 *            是否锁定，使用LockMode.UPGRADE
	 * @return 持久化对象
	 */
	protected T get(ID id, boolean lock) {
		T entity;
		if (lock) {
			// entity = (T) getEntityManager().get(getEntityClass(),
			// id,LockMode.UPGRADE);
			entity = (T) getEntityManager().find(getEntityClass(), id, LockModeType.PESSIMISTIC_WRITE);
		} else {
			entity = (T) getEntityManager().find(getEntityClass(), id);
		}
		return entity;
	}

	/**
	 * 获得Dao对于的实体类
	 * 
	 * @return
	 */
	abstract protected Class<T> getEntityClass();
}
